package gui;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.DefaultListModel;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

import alg.LMS;
import alg.PMC;

public class MainWindow extends JFrame {

	private static final long serialVersionUID = -6590218617476451342L;
	
	private JTextField textfieldTreina, textfieldValid, EQMvalor, TREvalor,
			VALvalor, Nrequisitos;
	private JButton okbutton, exitbutton;
	private JRadioButton PMC, RBF, Adaline, Todas;
	private JPanel painelCent, painelSup, painelInf, painelRedes, painelteste,
			painelteste2;
	private JLabel imagem, label, label2, label3, label4, endereçoVal,
			endereçoTreina, testelabel1, testelabel2;
	private JFrame janela;
	String caminho1 = "";
	String caminho2 = "";
	double EQM;
	int contRedes, amostraTrein, amostrasValid, requisitos;
	private CarregandoWindow window = new CarregandoWindow();

	public class CarregamentoPesado implements Runnable {

		@Override
		public void run() {
			comparador(caminho1, caminho2, contRedes, EQM, amostraTrein,
					amostrasValid, requisitos);
			window.setVisible(false);
		}
		
	}

	private class Handler implements ActionListener, ItemListener {

		public void actionPerformed(ActionEvent evento) {

			if (evento.getSource() == okbutton) {
				if (contRedes == 0) {
					JOptionPane.showMessageDialog(null, "Selecione uma rede!");
				} else {
					window.setVisible(true);
					caminho1 = textfieldTreina.getText();
					caminho2 = textfieldValid.getText();
					EQM = Double.parseDouble(EQMvalor.getText());
					amostraTrein = Integer.parseInt(TREvalor.getText());
					amostrasValid = Integer.parseInt(VALvalor.getText());
					requisitos = Integer.parseInt(Nrequisitos.getText());

					Thread t = new Thread(new CarregamentoPesado());
					t.start();
				}
			}

			if (evento.getSource() == exitbutton) {

				janela.dispose();

			}

		}

		public void itemStateChanged(ItemEvent evento) {

			if (evento.getSource() == PMC) {

				if (Adaline.isSelected() == true) {

					Adaline.setSelected(false);

				}

				if (Todas.isSelected() == true) {

					Todas.setSelected(false);

				}

				contRedes = 1;

			}

			if (evento.getSource() == Adaline) {

				if (PMC.isSelected() == true) {

					PMC.setSelected(false);

				}

				if (Todas.isSelected() == true) {

					Todas.setSelected(false);

				}

				contRedes = 2;

			}

			if (evento.getSource() == Todas) {

				if (PMC.isSelected() == true) {

					PMC.setSelected(false);
				}

				if (Adaline.isSelected() == true) {

					Adaline.setSelected(false);
				}
				contRedes = 3;
				
			}
		}
	}

	public MainWindow() {

		super("CALANGOS RNA");

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		Container container = getContentPane();
		container.setLayout(new BorderLayout());

		painelCent = new JPanel();
		painelSup = new JPanel();
		painelInf = new JPanel();
		painelRedes = new JPanel();
		painelCent.setLayout(new GridLayout(3, 2, 1, 1));
		painelSup.setLayout(new FlowLayout());
		painelInf.setLayout(new FlowLayout());
		painelRedes.setLayout(new GridLayout(1, 4, 1, 1));

		imagem = new JLabel();
		Icon bug = new ImageIcon(getClass().getClassLoader().getResource(
				"calango.gif"));
		imagem.setIcon(bug);

		painelSup.add(imagem);

		endereçoVal = new JLabel("Endereço do arquivo de validação:");
		painelCent.add(endereçoVal);

		textfieldValid = new JTextField(
				"/home/raphael/workspace/Aplicativo RNA/src/amostras_validação");
		painelCent.add(textfieldValid);

		endereçoTreina = new JLabel("Endereço do arquivo de treinamento:");
		painelCent.add(endereçoTreina);

		textfieldTreina = new JTextField(
				"/home/raphael/workspace/Aplicativo RNA/src/amostras_treinamento");
		painelCent.add(textfieldTreina);

		PMC = new JRadioButton("PMC");
		painelRedes.add(PMC);

		Adaline = new JRadioButton("Adaline");
		painelRedes.add(Adaline);

		Todas = new JRadioButton("Todas");
		painelRedes.add(Todas);

		okbutton = new JButton("OK");
		painelRedes.add(okbutton);

		painelCent.add(painelRedes);

		label = new JLabel("Erro quadratico Médio:");
		painelInf.add(label);

		EQMvalor = new JTextField("0.000010");
		painelInf.add(EQMvalor);

		label2 = new JLabel("Amostras validação:");
		painelInf.add(label2);

		VALvalor = new JTextField("10");
		painelInf.add(VALvalor);

		label3 = new JLabel("Amostras treinamento:");
		painelInf.add(label3);

		TREvalor = new JTextField("90");
		painelInf.add(TREvalor);

		label4 = new JLabel("Requisitos:");
		painelInf.add(label4);

		Nrequisitos = new JTextField("100");
		painelInf.add(Nrequisitos);

		container.add(painelSup, BorderLayout.NORTH);
		container.add(painelCent, BorderLayout.CENTER);
		container.add(painelInf, BorderLayout.SOUTH);

		Handler handler = new Handler();
		textfieldTreina.addActionListener(handler);
		okbutton.addActionListener(handler);
		PMC.addItemListener(handler);
		Adaline.addItemListener(handler);
		Todas.addItemListener(handler);

		setSize(1050, 420);
		setResizable(false);
	}

	public void comparador(String caminho1, String caminho2, int contRedes,
			double eqm, int amostrasTrein, int amostrasValid, int requisitos) {

		double[][] matriz = new double[amostrasTrein][requisitos + 1];
		double[][] value = new double[amostrasValid][requisitos + 1];
		double[] d = new double[amostrasTrein];

		try {
			FileReader arq = new FileReader(caminho1);
			BufferedReader lerArq = new BufferedReader(arq);

			String aux = lerArq.readLine();
			String[] sampleVector;
			for (int i = 0; i < amostrasTrein; i++) {

				sampleVector = aux.split(", ");

				for (int j = 0; j < requisitos + 1; j++) {

					if (j == 0) {
						matriz[i][j] = (double) -1.000;

					}

					else {
						matriz[i][j] = Float.parseFloat(sampleVector[j - 1]);
					}

				}

				d[i] = Float.parseFloat(sampleVector[sampleVector.length - 1]);

				aux = lerArq.readLine();
			}

			arq.close();
		} catch (IOException e) {

			JOptionPane.showMessageDialog(null,
					"Erro na abertura do arquivo de treinamento!");
			System.exit(1);

		}

		try {
			FileReader arq2 = new FileReader(caminho2);
			BufferedReader lerArq2 = new BufferedReader(arq2);

			String aux = lerArq2.readLine();
			String[] sampleVector;
			for (int i = 0; i < amostrasValid; i++) {

				sampleVector = aux.split(", ");

				for (int j = 0; j < requisitos + 1; j++) {

					if (j == 0) {
						value[i][j] = (double) -1.000;

					}

					else {
						value[i][j] = Float.parseFloat(sampleVector[j - 1]);
					}

				}

				aux = lerArq2.readLine();

			}

			arq2.close();
		} catch (IOException e) {

			JOptionPane.showMessageDialog(null,
					"Erro na abertura do arquivo de validação!");
			System.exit(1);

		}

		if (contRedes == 1) {

			int epoca1;
			PMC teste1 = new PMC(10, requisitos + 1);
			teste1.inicializar();
			epoca1 = teste1.treinar(matriz, d, amostrasTrein, eqm);

			janela = new JFrame();
			janela.setLayout(new BorderLayout());

			JList<String> lista1;
			DefaultListModel<String> modelo = new DefaultListModel<String>();

			lista1 = new JList<String>(modelo);

			painelteste = new JPanel();
			painelteste.setLayout(new GridLayout(2, 1, 1, 1));

			testelabel1 = new JLabel("Épocas PMC: " + epoca1);
			painelteste.add(testelabel1);

			for (int i = 0; i < amostrasValid; i++) {

				modelo.addElement("Resposta" + (i + 1) + "  : "
						+ teste1.classificar(value[i]));

			}

			JScrollPane scrollPane = new JScrollPane(lista1);

			janela.add(painelteste, BorderLayout.NORTH);
			janela.add(scrollPane, BorderLayout.CENTER);
			exitbutton = new JButton("EXIT");
			janela.add(exitbutton, BorderLayout.SOUTH);

			Handler handler = new Handler();
			exitbutton.addActionListener(handler);

			janela.setSize(640, 480);
			janela.setLocation(320, 0);
			janela.setVisible(true);

		}

		if (contRedes == 2) {

			int epoca2;
			LMS teste2 = new LMS(requisitos + 1);
			teste2.inicializar();
			epoca2 = teste2.treinar(matriz, d, amostrasTrein, eqm);

			janela = new JFrame();
			janela.setLayout(new BorderLayout());

			JList<String> lista2;
			DefaultListModel<String> modelo = new DefaultListModel<String>();

			lista2 = new JList<String>(modelo);

			painelteste = new JPanel();
			painelteste.setLayout(new GridLayout(2, 1, 1, 1));

			testelabel1 = new JLabel("Épocas Adaline: " + epoca2);
			painelteste.add(testelabel1);

			for (int i = 0; i < amostrasValid; i++) {

				modelo.addElement("Resposta" + (i + 1) + "  : "
						+ teste2.classificar(value[i]));

			}

			JScrollPane scrollPane = new JScrollPane(lista2);

			janela.add(painelteste, BorderLayout.NORTH);
			janela.add(scrollPane, BorderLayout.CENTER);
			exitbutton = new JButton("EXIT");
			janela.add(exitbutton, BorderLayout.SOUTH);

			Handler handler = new Handler();
			exitbutton.addActionListener(handler);

			janela.setSize(640, 480);
			janela.setLocation(320, 0);
			janela.setVisible(true);

		}

		if (contRedes == 3) {

			int epoca1, epoca2;
			PMC teste1 = new PMC(10, requisitos + 1);
			LMS teste2 = new LMS(requisitos + 1);

			teste1.inicializar();
			teste2.inicializar();
			epoca1 = teste1.treinar(matriz, d, amostrasTrein, eqm);
			epoca2 = teste2.treinar(matriz, d, amostrasTrein, eqm);

			janela = new JFrame();
			janela.setLayout(new BorderLayout());

			JList<String> lista3;
			JList<String> lista4;
			DefaultListModel<String> modelo = new DefaultListModel<String>();
			DefaultListModel<String> modelo2 = new DefaultListModel<String>();

			lista3 = new JList<String>(modelo);
			lista4 = new JList<String>(modelo2);

			painelteste = new JPanel();
			painelteste2 = new JPanel();
			painelteste.setLayout(new GridLayout(3, 1, 1, 1));
			painelteste2.setLayout(new GridLayout(2, 1, 1, 1));

			testelabel1 = new JLabel("Épocas PMC: " + epoca1);
			testelabel2 = new JLabel("Épocas Adaline: " + epoca2);
			painelteste.add(testelabel1);
			painelteste.add(testelabel2);

			modelo.addElement("--PMC--");

			for (int i = 0; i < amostrasValid; i++) {

				modelo.addElement("Resposta" + (i + 1) + "  : "
						+ teste1.classificar(value[i]));

			}

			modelo2.addElement("--Adaline--");

			for (int i = 0; i < amostrasValid; i++) {

				modelo2.addElement("Resposta" + (i + 1) + "  : "
						+ teste2.classificar(value[i]));

			}

			JScrollPane scrollPane1 = new JScrollPane(lista3);
			JScrollPane scrollPane2 = new JScrollPane(lista4);

			janela.add(painelteste, BorderLayout.NORTH);
			painelteste2.add(scrollPane1);
			painelteste2.add(scrollPane2);
			janela.add(painelteste2, BorderLayout.CENTER);
			exitbutton = new JButton("EXIT");
			janela.add(exitbutton, BorderLayout.SOUTH);

			Handler handler = new Handler();
			exitbutton.addActionListener(handler);

			janela.setSize(640, 480);
			janela.setLocation(320, 0);
			janela.setVisible(true);

		}

		PMC.setSelected(false);
		Adaline.setSelected(false);
		Todas.setSelected(false);
		contRedes = 0;

	}
}
